#include <allegro.h>
#include <stdio.h>
#include "fase.h"
#include "nelib.h"
#include "terreno.h"


fase::fase(const char *arquivo) {
	int temp_ter_x, temp_ter_y, temp_ter_w, temp_ter_h;
	char temp_obj_name[50];
	char temp_midi_name[50];
	char temp_background_name[50];
	pfase = fopen(arquivo, "r");
	
	if (pfase == NULL) return;
	
	fscanf(pfase, "%s", nome);
	fscanf(pfase, "%s", temp_midi_name);
	fscanf(pfase, "%d %d", &w, &h);
	fscanf(pfase, "%d %d", &x, &y);
	fscanf(pfase, "%s", temp_background_name);
	fscanf(pfase, "%d", &obj_n);
	
	background = new imagem(temp_background_name);
	
	if (strcmp(temp_midi_name,"NULL"))
		mfundo = load_midi(temp_midi_name);
	else
		mfundo = NULL;

	for (int i = 0; i < obj_n; i++) {
		fscanf(pfase, "%d %d %d %d %s", &temp_ter_x, &temp_ter_y, &temp_ter_w, &temp_ter_h, temp_obj_name); 
		obj.push_back(new terreno(temp_ter_x, temp_ter_y, temp_ter_w, temp_ter_h, temp_obj_name));
	}
	fclose(pfase);
}

void fase::draw_obj(BITMAP *buffer) {
	for (int i = 0; i < obj_n; i++) {
		obj[i]->draw(buffer, this->x, this->y, this->w, this->h);
	}
}

void fase::draw_background(BITMAP *buffer) {
	masked_blit(background->bmp, buffer, background->x, background->y, 0, 0, w, h);
}


int fase::colisao_x(int ox, int oy, int ow, int oh, int vel_x, int *game_state){
	int temp_x = -1;
	int temp_game_state = *game_state;
	for(int i = 0; i < obj_n; i++) {
		if (::colisao(obj[i]->x, obj[i]->y, obj[i]->w, obj[i]->h, (ox + vel_x), oy, ow, oh)) {
			if ( (vel_x + obj[i]->vel_x > 0) && ((temp_x = -1) || ((obj[i]->x - ow) < temp_x) ) ) {				temp_x = obj[i]->x - ow;
				if (obj[i]->stats["agressivo"] == true) {
					*game_state = 3;
				}
				else
					*game_state = temp_game_state;
			}
			if ( (vel_x + obj[i]->vel_x < 0) && ((obj[i]->x + obj[i]->w) > temp_x) ) {
				temp_x = obj[i]->x + obj[i]->w;
				if (obj[i]->stats["agressivo"] == true) {
					*game_state = 3;
				}
				else
					*game_state = temp_game_state;
			}
		}
	}
	if (temp_x != -1)
		return temp_x;
	return ox + vel_x;
}

int fase::colisao_y(int ox, int oy, int ow, int oh, int *vel_y, int *chao, int *game_state){
	int temp_y = -1;
	int teto = 0;
	int temp_game_state = *game_state;
	for(int i = 0; i < obj_n; i++) {
		if (::colisao(obj[i]->x, obj[i]->y, obj[i]->w, obj[i]->h, ox, (oy + *vel_y), ow, oh)) {
			if ( (*vel_y + obj[i]->vel_y > 0) && (temp_y == -1 || (obj[i]->y - oh) < temp_y ) ) {
				temp_y = obj[i]->y - oh;
				*chao = 1;
				if (obj[i]->stats["agressivo"] == true) {
					*game_state = 3;
				}
				else
					*game_state = temp_game_state;
			}
			if ( (*vel_y + obj[i]->vel_y < 0) && (obj[i]->y + obj[i]->h > temp_y ) ) {
				temp_y = obj[i]->y + obj[i]->h;
				teto = 1;
				if (obj[i]->stats["agressivo"] == true) {
					*game_state = 3;
				}
				else
					*game_state = temp_game_state;
			}
		}
	}
	if (teto == 1 || *chao == 1)
		*vel_y = 0;
	if (temp_y != -1)
		return temp_y;
	return oy + *vel_y;
}

void fase::toca(){
	if (mfundo != NULL)
		play_midi(mfundo, 1);
}

void fase::para_toca(){
	if (mfundo != NULL)
		stop_midi();
}
